package com.renl.juc.volatiletest;

/**
 * @author renl
 * @date 2019/12/25
 */
class MyData{
  volatile int num = 0;
//  int num = 0;
  public void addTo60(){
    this.num = 60;
  }
}

/**
 * 验证volatile的可见性
 * 当 num 不具有 可见性时 主线程不知道num值被改了 一直等待
 *
 * 各个线程对主内存中共享变量的操作都是各个线程各自拷贝到自己的工作内存进行操作后再写回到主内存中的
 *
 * 可能存在 当一个A线程修改了共享变量X的值但还未写回到主内存时，另外一个线程B又对主内存中统一共享变量X进行操作
 * 但此时A线程工作内共享变量X对线程B来说并不可见，就会造成原子性问题
 *
 */
public class VolatileDemo {
  //一切方法的运行入口
  public static void main(String[] args) {
    MyData myData = new MyData();
    new Thread(() -> {
      try {
        Thread.sleep(3000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      myData.addTo60();
      System.out.println(Thread.currentThread().getName()+":myData.num = "+myData.num);
    },"A").start();


    while (myData.num == 0){}

    System.out.println(Thread.currentThread().getName()+":myData.num = "+myData.num);

  }
}
